<?php

class DataController extends Controller{
	
	/**
	* Declares class-based actions.
	*/
	public function actions()
	{
		return array(
		// captcha action renders the CAPTCHA image displayed on the contact page
				'captcha'=>array(
					'class'=>'CCaptchaAction',
					'backColor'=>0xFFFFFF,
		),
		// page action renders "static" pages stored under 'protected/views/site/pages'
		// They can be accessed via: index.php?r=site/page&view=FileName
				'page'=>array(
					'class'=>'CViewAction',
		),
		);
	}
	
	
	
/**
 * 
 * Funkcja pobiera wszystkie dane na temat lokalizacji, która została przesłana metodą POST.
 * Następnie pobierana jest pogoda dla wybranego miejsca i z otrzymanych danych konstruowana
 * jest tablica zawierająca wszystkie parametry związane z pogodą, lokalizacją i ich wartości.
 * 
 */
	public function actionGetMarkerData(){
	
		$criteria=new CDbCriteria;
		$criteria->condition='title=:title';
		$criteria->params=array(':title'=>$_POST['location']);
		$location=Location::model()->find($criteria);
		
		
		//TODO zunifikować - albo wywoałen z timestampem, albo bez
		$criteria=new CDbCriteria;
		if(isset($_POST['timestamp'])){
			$criteria->condition='id_loc=:id_loc AND datetime_stamp=:stamp';
			$criteria->params=array(':id_loc'=>$location->id, ':stamp'=>$_POST['timestamp']);
		}else{
			$criteria->condition='id_loc=:id_loc';
			$criteria->params=array(':id_loc'=>$location->id);
		}
		if (!$weather=Weather::model()->find($criteria))
			$data='brak';
		else {
			$data = array(0 => $location->id, 
			1 => $location->title, 
			2 => $location->latitude, 
			3 => $location->longitude,
			'skin_temp'=>$weather->skin_temp,
			'soil_temp'=>$weather->soil_temp,
			'u_wind'=>$weather->u_wind_10m,
			'v_wind'=>$weather->v_wind_10m,
			'total_col_rain'=>$weather->total_col_rain,
			'total_col_snow'=>$weather->total_col_snow,
			'low_cloud_fra'=>$weather->low_cloud_fra,
			'mid_cloud_fra'=>$weather->mid_cloud_fra,
			'high_cloud_fra'=>$weather->high_cloud_fra);
		}
		
		header('Content-type: application/json');
		
		echo CJSON::encode($data);
	
		Yii::app()->end();
	}

/**
 * 
 * Funkcja pobiera listę lokalizacji, które posiadają jakiekolwiek dane pogodowe w bazie danych.
 * Następnie w kolejnym zapytaniu, wykorzystywana jest ta lista by znaleźć wszystkie lokalizacje,
 * które na tej liście się znajdują bądź pobrać ich ograniczoną ilość (stosowane to jest by na
 * mapie nie było zbyt dużo znaczników w jednym momencie). Po tym, pobierane są parametry pogodowe
 * dla wynikowej listy lokalizacji by przekazać te dane jako tablica do funkcji wywołującej.
 * 
 */
	public function actionGetMarkersWeatherData(){
				
		header('Content-type: application/json');	
				
		$locationsWeather=array();
		$sql='SELECT id_loc FROM weather GROUP BY id_loc ORDER BY id_loc';
		$connection=Yii::app()->db;
		$command=$connection->createCommand($sql);
		if ($rows=$command->queryAll()) {
			$where_in='';
			foreach($rows as $row){
				$where_in.=$row['id_loc'].',';
			}
			$where_in=substr($where_in, 0, -1);
			if ($_POST['mode']==0)
				$sql='SELECT * FROM location WHERE id IN ('.$where_in.')';
			else if ($_POST['mode']==1)
				$sql='SELECT loc1.* FROM location AS loc1 JOIN location AS loc2 ON loc1.id=loc2.id WHERE loc1.id IN (1,4,5,6,8,9,10,20,31,36,43,48,51,52) AND loc2.id IN ('.$where_in.')';
			// 1,4,5,6,8,9,10,20,31,36,43,48,51,52 - główne miejscówki (loc1)
			// where_in - miejscówki z dostępną pogodą
			$command=$connection->createCommand($sql);
			$locations=$command->queryAll();
			
			foreach($locations as $location){
				$criteria=new CDbCriteria;
				$criteria->condition='id_loc=:id_loc AND datetime_stamp=:stamp';
				$criteria->params=array(':id_loc'=>$location['id'], ':stamp'=>$_POST['timestamp']);
				$weather=Weather::model()->find($criteria);
				
				array_push($locationsWeather, array('location_title'=>$location['title'], 'location_latitude'=>$location['latitude'], 'location_longitude'=>$location['longitude'], 'weather_conditions'=>$weather));
			}
		}
		else
			$locationsWeather='brak';
		echo CJSON::encode($locationsWeather);
	
		Yii::app()->end();
	}
	
/**
 * 
 * Funkcja pobiera wszystkie lokalizacje, które posiadają jakiekolwiek parametry
 * pogodowe i jako tablica zwraca do procedury, która ją wywołała.
 * 
 */
	public function actionGetMarkersData(){
		header('Content-type: application/json');

		$sql='SELECT id_loc FROM weather GROUP BY id_loc ORDER BY id_loc';
		$connection=Yii::app()->db;
		$command=$connection->createCommand($sql);
		$rows=$command->queryAll();
		$where_in='';
		foreach($rows as $row){
			$where_in.=$row['id_loc'].',';
		}
		$where_in=substr($where_in, 0, -1);
		$sql='SELECT * FROM location WHERE id IN ('.$where_in.')';
		$command=$connection->createCommand($sql);
		$locations=$command->queryAll();

		$data = array();
		
		foreach($locations as $location){
			array_push($data, $location);
		}
		
		echo CJSON::encode($data);
		
		Yii::app()->end();
	}

/**
 * 
 * Procedura, która pobiera z bazy danych wszystkie regiony
 * wraz z atrybutami i zwraca te dane jako tablica.
 * 
 */
	public function actionGetRegions(){
		header('Content-type: application/json');
		$regions=Region::model()->findAll();
		$data = array();
		
		foreach($regions as $region){
			array_push($data, $region);
		}
		
		echo CJSON::encode($data);
		
		Yii::app()->end();
	}

/**
 * 
 * Procedura, która pobiera z bazy danych wszystkie lokalizacje
 * wraz z atrybutami i zwraca te dane jako tablica.
 * 
 */
	public function actionGetAllLocations(){
		header('Content-type: application/json');
		
		$result=Location::model()->findAll();
		
		echo CJSON::encode($result);
	
		Yii::app()->end();
	}

/**
 * 
 * Funkcja, która pobiera listę lokalizacji, które znajdują się
 * w wybranym przez użytkownika regionie. Dane są zwracane jako tablica.
 * 
 */
	public function actionGetLocations(){
		header('Content-type: application/json');
		
		$sql='SELECT loc.id, loc.title, loc.latitude, loc.longitude, reg.code FROM location AS loc JOIN location_region AS lr ON loc.id = lr.id_loc JOIN region AS reg ON reg.id=lr.id_reg WHERE lr.id_reg=:id_reg';
		$connection=Yii::app()->db;
		$command=$connection->createCommand($sql);
		$command->bindParam(":id_reg",$_POST['id_reg'],PDO::PARAM_INT);
		$rows=$command->queryAll();
		
		echo CJSON::encode($rows);
	
		Yii::app()->end();
	}

/**
 * 
 * Procedura, która pobiera z bazy danych listę ulubionych lokalizacji
 * danego użytkownika i zwraca je jako tablicę. Jeśli użytkownik nie
 * jest zalogowany zostanie zwrócona zmienna tekstowa.
 * 
 */
	public function actionGetFavourites(){
		header('Content-type: application/json');
		if (!Yii::app()->user->isGuest) {
			$userObject = Yii::app()->getModule('user')->user();
			$sql='SELECT favourites FROM tbl_profiles WHERE user_id=:id';
			$connection=Yii::app()->db;
			$command=$connection->createCommand($sql);
			$id=$userObject->id;
			$command->bindParam(":id",$id,PDO::PARAM_INT);
			$rows=$command->queryAll();
			
			if ($rows[0]['favourites']==null)
				$rows[0]['favourites']='brak';
		}
		else
			$rows='guest';
		
		echo CJSON::encode($rows);
	
		Yii::app()->end();
	}

/**
 * 
 * Funkcja ma za zadanie pobrać z bazy danych ulubione lokalizacje
 * użytkownika i sprawdzić, czy ma już zapisane dane miejsce.
 * Odpowiedni komunikat poprzez zmienną tekstową jest zwracany
 * na zakończenie funkcji.
 * 
 */
	public function actionCheckFavourite(){
		header('Content-type: application/json');
		if (!Yii::app()->user->isGuest) {
			$userObject = Yii::app()->getModule('user')->user();
			$sql='SELECT favourites FROM tbl_profiles WHERE user_id=:id';
			$connection=Yii::app()->db;
			$command=$connection->createCommand($sql);
			$id=$userObject->id;
			$command->bindParam(":id",$id,PDO::PARAM_INT);
			$rows=$command->queryAll();
			
			if ($rows[0]['favourites']==null)
				$rows='pusty';
			else {
				$temp=$_POST['fav'];
				$favs=explode(',',$rows[0]['favourites']);
				array_unshift ($favs, "0");
				if (array_search($temp, $favs))
					$rows='jest';
				else
					$rows='brak';
			}
		}
		else
			$rows='guest';
		
		echo CJSON::encode($rows);
	
		Yii::app()->end();
	}

/**
 * 
 * Procedura zajmuje się pobraniem z bazy danych identyfikatora,
 * nazwy i współrzędnych lokalizacji, które użytkownik ma
 * zapisane w swoich ulubionych miejscach. Odebrane dane są
 * zwracane jako tablica.
 * 
 */
	public function actionGetFavouritesNames(){
		header('Content-type: application/json');
		if (!Yii::app()->user->isGuest) {
			$sql='SELECT id,title,latitude,longitude FROM location WHERE id IN ('.$_POST['range'].')';
			$connection=Yii::app()->db;
			$command=$connection->createCommand($sql);
			$rows=$command->queryAll();
			
			$data = array();
			foreach($rows as $row){
				array_push($data, $row);
			}
		}
		else
			$data='guest';

		echo CJSON::encode($data);
	
		Yii::app()->end();
	}

/**
 * 
 * 
 * 
 */
	public function actionGetChartData(){
				
		header('Content-type: application/json');	
				
		$loc = $_POST["loc"];
		//$loc = $loc == null ? 29 : $loc;

		$limit = $_POST["limit"];

		$sql = "SELECT * FROM weather WHERE id_loc = $loc ORDER BY datetime_stamp";
		if($limit!= 0)
			$sql = "SELECT * FROM weather WHERE id_loc = $loc ORDER BY datetime_stamp LIMIT $limit";
		
		$connection=Yii::app()->db;
		$command=$connection->createCommand($sql);
		$rows=$command->queryAll();
		
	
		echo CJSON::encode($rows);
	
		Yii::app()->end();
	}

/**
 * 
 * Funkcja zajmuje się aktualizacją komórki w bazie danych
 * odpowiedzialnej za ulubione miejsca użytkownika. Jeśli
 * operacja się powiodła, wykonywane jest zapytanie, które
 * pobierze dane nowo dodanej wartości i wszystkie dane
 * są zwracane za pomocą tablicy.
 * 
 */
	public function actionAddFavourite(){
		header('Content-type: application/json');
		$sql='UPDATE tbl_profiles SET favourites = CONCAT(favourites,\''.$_POST['fav'].',\') WHERE user_id=:id';
		$userObject = Yii::app()->getModule('user')->user();
		$connection=Yii::app()->db;
		$id=$userObject->id;
		$command = $connection->createCommand($sql);
		$command->bindParam(":id",$id,PDO::PARAM_INT);
		$rows=$command->execute();
		
		if ($rows!=null) {
			$sql2='SELECT latitude,longitude FROM location WHERE id='.$_POST['fav'];
			$command = $connection->createCommand($sql2);
			$rows=$command->queryAll();
		}
			
		echo CJSON::encode($rows);
	
		Yii::app()->end();
	}

/**
 * 
 * W pierwszej kolejności funkcja pobiera z bazy danych wiersz,
 * który zawiera ulubione miejsce przeznaczone do usunięcia.
 * Jeśli operacja się powiodła wykonywane jest wycięcie
 * niechcianego parametru i jego wartości, a następnie
 * zaktualizowanie komórki w bazie danych.
 * 
 */
	public function actionDeleteFavourite(){
		header('Content-type: application/json');
		if (!Yii::app()->user->isGuest) {
			$userObject = Yii::app()->getModule('user')->user();
			$sql='SELECT favourites FROM tbl_profiles WHERE user_id=:id';
			$connection=Yii::app()->db;
			$command=$connection->createCommand($sql);
			$id=$userObject->id;
			$command->bindParam(":id",$id,PDO::PARAM_INT);
			$rows=$command->queryAll();

			if ($rows[0]['favourites']==null)
				$rows[0]['favourites']='brak';
			else {
				
				$temp=$rows[0]['favourites'];
				$delim=$_POST['fav'].',';
				list($first,$last)=explode($delim,$temp);
				$sql='UPDATE tbl_profiles SET favourites = \''.$first.$last.'\' WHERE user_id=:id';
				$connection=Yii::app()->db;
				$id=$userObject->id;
				$command = $connection->createCommand($sql);
				$command->bindParam(":id",$id,PDO::PARAM_INT);
				$rows=$command->execute();
			}
		}
		else
			$rows='guest';
		
		echo CJSON::encode($rows);
	
		Yii::app()->end();
	}
	
/**
 * 
 * Funkcja pobiera dla określonej godziny (która zostaje przesłana
 * jako zmienna metodą POST) temperaturę odczuwalną - najniższą
 * oraz najwyższą wraz z nazwami lokalizacji gdzie te temperatury
 * występują. Dane zwracane są jako tablica.
 * 
 */
	public function actionGetHomePageWeatherParameters(){
		header('Content-type: application/json');
		
		$datetime_stamp=$_POST['timestamp'];
		$connection=Yii::app()->db;
		
		$query_min_temp = "select l.title, w.skin_temp from weather w, location l where w.skin_temp=(select min(skin_temp) from weather where datetime_stamp=:datetime_stamp) AND w.id_loc=l.id LIMIT 0,1";
		$command=$connection->createCommand($query_min_temp); 
		$command->bindParam(":datetime_stamp",$datetime_stamp,PDO::PARAM_STR);
		$rows=$command->queryAll();
		
		$data = array();
		foreach($rows as $row){
			array_push($data, $row);
		}

		$query_max_temp = "select l.title, w.skin_temp from weather w, location l where w.skin_temp=(select max(skin_temp) from weather where datetime_stamp=:datetime_stamp) AND w.id_loc=l.id LIMIT 0,1";
		$command=$connection->createCommand($query_max_temp); 
		$command->bindParam(":datetime_stamp",$datetime_stamp,PDO::PARAM_STR);
		$rows=$command->queryAll();

		foreach($rows as $row){
			array_push($data, $row);
		}

		echo CJSON::encode($data);
	
		Yii::app()->end();
	}
}